package co.yixiang.modules.shop.service;

import co.yixiang.modules.shop.domain.YxStoreProduct;
import co.yixiang.modules.shop.domain.YxStoreProductAttr;
import co.yixiang.modules.shop.domain.YxStoreProductAttrValue;
import co.yixiang.modules.shop.service.dto.*;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
* @author hupeng
* @date 2019-10-04
*/
//@CacheConfig(cacheNames = "yxStoreProduct")
public interface YxStoreProductService {

    /**
    * 查询数据分页
    * @param criteria
    * @param pageable
    * @return
    */
    //@Cacheable
    Map<String,Object> queryAll(YxStoreProductQueryCriteria criteria, Pageable pageable);

    /**
    * 查询所有数据不分页
    * @param criteria
    * @return
    */
    //@Cacheable
    List<YxStoreProductDTO> queryAll(YxStoreProductQueryCriteria criteria);

    /**
     * 根据ID查询
     * @param id
     * @return
     */
    //@Cacheable(key = "#p0")
    YxStoreProductDTO findById(Integer id);

    /**
     * 创建
     * @param resources
     * @return
     */
    //@CacheEvict(allEntries = true)
    YxStoreProductDTO create(YxStoreProduct resources);

    /**
     * 编辑
     * @param resources
     */
    //@CacheEvict(allEntries = true)
    void update(YxStoreProduct resources);

    /**
     * 删除
     * @param id
     */
    //@CacheEvict(allEntries = true)
    void delete(Integer id);

    void recovery(Integer id);

    void onSale(Integer id, Integer status);

    List<ProductFormatDTO> isFormatAttr(Integer id, String jsonStr);

    void createProductAttr(Integer id, String jsonStr);

    void setResult(Map<String, Object> map, Integer id);

    void clearProductAttr(Integer id, boolean isActice);

    String getStoreProductAttrResult(Integer id);

    /**
     * 查询成本价为空的商品
     * @return
     */
    List<YxStoreProduct> findAllPriceNull();

    List<YxStoreProduct> findArryById(String id);

    void onSaleInvest(Integer id, int isStockInvest);

    /**
     * 保存商品的属性与商品的属性值
     * @param storeProductAttr
     * @param yxStoreProductAttrValue
     */
    void saveProductAttr(YxStoreProductAttr storeProductAttr,YxStoreProductAttrValue yxStoreProductAttrValue);

    /**
     * 通过商品ID查询规则属性值
     * @param productId
     * @return
     */
    List<YxStoreProductAttrValue> getListProductAttrValue(Integer productId);

    /**
     * 查询保留商品管理
     * @param criteria
     * @param pageable
     * @return
     */
    Object findListKeepGoods(KeepGoodsQueryCriteria criteria, Pageable pageable);

    /**
     * 释放保留商品
     * @param id
     * @param i
     * @return
     */
    int updateLockStatus(String id, int i);

    /**
     * 查询到期锁定的商品
     * @return
     */
    List<YxStoreProduct> findGoodsLock();

    /**
     * 通过品牌名称查询品牌ID
     * @param brandName
     * @return
     */
    Integer findBrandId(String brandName);


    Integer findDetailId(String name, String label);

    /**
     * 通过商品名称与供应商查询商品
     * @param storeId
     * @param storeName
     * @param supplierCode
     * @return
     */
    YxStoreProduct findByGoods(String storeId,String storeName, String supplierCode);

    /**
     * 通过条码查下商品
     * @param pageable
     * @return
     */
    List<YxStoreProduct> findByBarCode(String  pageable);

    /**
     * 商城商品上架/下架
     * @param id
     * @param isMallOn
     */
    void onMallSale(Integer id, Integer isMallOn);

    YxStoreProduct findByStoreGoods(String trim, String storeName);

    /**
     * 查询分页库存盘点
     * @param criteria
     * @param pageable
     * @return
     */
    Map<String,Object> getStockTaking(StockTakingQueryCriteria criteria, Pageable pageable);

    /**
     *查询不分页库存盘点
     * @param criteria
     * @return
     */
    List<Map<String,Object>> stockTakingList(StockTakingQueryCriteria criteria);

    /**
     * 查询已认购的商品
     * @return
     */
    List<Map<String,Objects>> findGoodsSubscript(String storeName,String isInvested,String isHot);

    /**
     * * 更新认购商品并更新规则属性值
     */
    void updateSubscripGoods(YxStoreProductDTO yxStoreProductDTO);

    /**
     * 查询可以参与促销的商品
     * @param criteria
     * @param pageable
     * @return
     */
    Object getPromoteProduct(PromoteProductQueryCriteria criteria, Pageable pageable);

    /**
     * 查询商品表中的品牌
     * @return
     */
    List<String> getListBrandName();
}